import argparse


def get_args_parser():
    parser = argparse.ArgumentParser('DeiT training and evaluation script', add_help=False)
    # 共享参数==================================================================
    parser.add_argument('--problem', default=1, type=int, help='problem')
    parser.add_argument('--mut_cof', default=0.5, type=float, help='只对问题3有效，变异大小0-1，默认0.5，影响不大')
    parser.add_argument('--mut_std', default=0.0001, type=float,
                        help='变异概率0-1，默认0.001，对于问题1需要<0.005(0.0001)才能较快收敛，对于问题2需要>0.3(0.67)才能较快收敛，影响不大')
    parser.add_argument('--c1', default=2, type=float, help='个体学习率，默认2，增大数值会加快收敛速度，但最终效果会变差,若结果不好，可以尝试减小')
    parser.add_argument('--c2', default=2, type=float, help='全局学习率，默认2，增大数值会加快收敛速度，但最终效果会变差，若结果不好，可以尝试减小')
    parser.add_argument('--T0', default=1, type=float, help='只对问题3使用模拟退火时有效，T0，模拟退火开始的温度，默认为1e5，一般设为最大损失值')
    parser.add_argument('--Te', default=1e-5, type=float, help='只对问题3使用模拟退火时有效，Te，模拟退火结束的温度，默认为1e-5')
    parser.add_argument('--L', default=10000, type=int,
                        help='只对问题3使用模拟退火时有效，模拟退火链长，同一温度时尝试次数，越长效果越好，速度越慢，速度过慢可调小，默认3000')
    parser.add_argument('--epochs', default=2000, type=int, help='迭代次数，默认2000，增大数值可获得更好结果，但总时长会变长，总时长过长可调小')
    parser.add_argument('--max_stay_step', default=100, type=int, help='迭代次数，超过此次数则停止，默认100，增大数值可获得更好结果，但总时长会变长')
    parser.add_argument('--batch', default=4096, type=int,
                        help='种群大小，默认4096，需要是2的整倍数，增大数值会增加每轮时长，同时获得更好的最终结果，若未得到理想结果可适当增大数值，速度过慢可调小')
    parser.add_argument('--MAP_AK', default='PqwMsVjHG1o1uGD00vf1a6pZXEyZL8io', type=str, help='带验证的地图调用的AK')
    parser.add_argument('--MAP_SK', default='4ZCVuW2PlKqwkPCW8FcZSawt5CH0tXkH', type=str, help='带验证的地图调用的SK')
    parser.add_argument('--MAP_AK_NO_SN_CHK', default='GWCBfvhtDyfPcpIi6QwPWyRayu1HQsLO', type=str, help='地图调用的AK')
    parser.add_argument('--device', default='cuda', type=str, help='使用设备 可设为 cpu cuda 默认 cuda')
    parser.add_argument('--seed', default=0, type=int, help='随机数种子，默认0')
    parser.add_argument('--val', action="store_true", help='是否验证')

    # 问题1参数==================================================================
    parser.add_argument('--bit_precision', default=8, type=int, help='问题1:<=8,规划精度')
    parser.add_argument('--limit_shortage', default=0, type=float, help='问题1:限制最大缺钞率')
    parser.add_argument('--limit_usage', default=1, type=float, help='问题1:要求使用率')
    parser.add_argument('--limit_cutoff', default=0, type=float, help='问题1:清机系数可超过的总数')
    parser.add_argument('--limit_addfreq', default=0, type=float, help='问题1:限制最大加钞频率')
    parser.add_argument('--ratio_overadd', default=1, type=float, help='问题1:缺钞的相对重要程度，越大缺的越少')

    parser.add_argument('--date', default='2022-03-21', type=str, help='规划时的日期yyyy-mm-dd,只用于读取文件和计算星期几')
    parser.add_argument('--restday', default=[6, 7], type=list, help='星期几不加钞')
    # 问题2参数==================================================================
    parser.add_argument('--endpoint', default=41, type=int, help='问题2:车辆个数')
    parser.add_argument('--n_dim', default=162, type=int, help='问题2:网点个数')
    parser.add_argument('--enplt', action="store_true", help='问题2:是否绘图')
    parser.add_argument('--retry', default=10, type=int, help='问题2:重试次数，未规划出合理路线重试最多次数，默认10')
    # 问题3参数==================================================================
    parser.add_argument('--method', default=1, type=int, help='问题3:方法')
    parser.add_argument('--input_size', default=42, type=int, help='问题3:股票个数')
    parser.add_argument('--limit_E', default=1e-5, type=float, help='问题3:最小收益率')
    parser.add_argument('--limit_V', default=5e-2, type=float, help='问题3:最大风险值，见金融学术语Conditional Value at Risk')
    parser.add_argument('--a', default=0.95, type=float, help='问题3:var的置信区间0-1，见金融学术语Conditional Value at Risk')
    return parser
